package 面向对象;
//类的初始化顺序
/*
 *第一次创建类时，类的初始化顺序:
 *从父类>>>子类，依次静态初始化块>>[所有静态初始化块完成后]>>>>>>父类(普通初始化块>构造器)>>子类(普通初始化块>构造器)
 *内存中已经存在类时，略过静态初始化块
 *super()关键字用法下方
 */
public class 继承2类的初始化
{
	public static void main(String[] args){
		System.out.println("====第一次创建====");
		new Leaf();//类的第一次创建，需要自父>子初始化静态的初始化块，然后再自父>子普通初始化和构造器
		System.out.println("***再次创建，跳过静态初始化块初始化***");
		new Leaf();//内存中已经有leaf类，只执行普通初始化块和构造器
	}
}

class Root{
	static {//静态初始化块
		System.out.println("Root的静态初始化块");
	}
	{//普通初始化块
		System.out.println("Root的普通初始化块");
	}
	public  Root(){
		System.out.println("Root的无参构造器");
	}
}
class Mid extends Root{
	static {
		System.out.println("Mid的静态初始化块");
	}
	{
		System.out.println("Mid的普通初始化块");
	}
	public Mid(){
		System.out.println("Mid的无参数构造器");
	}
	public Mid(String msgs){
		this();
		System.out.println("Mid的带参数构造器，"+"参数是 "+msgs);
	}
}
class Leaf extends Mid{
	static{
		System.out.println("Leaf的静态初始化块");

	}
	{
		System.out.println("Leaf的普通初始化块");
	}
	public Leaf(){
		/**
			super用法
			1,调用父类属性，super.属性名
			2,调用父类方法，super.方法名   如super.Root()
			3,调用父类构造方法，同this(本类)，必须放在第一条
			  super(实参)  如下面的super("类的初始化")
			  super()，默认调用父类无参数构造器
		*/
		
		super("类的初始化");
		System.out.println("执行leaf构造器");
	}
}

